package com.xf.day05

/**
 * 注意:
 *  测试闭包的内容
 */
object TestBiPackage {
  def main(args: Array[String]): Unit = {

//    // unnamedFunctionTest()
//    // println(getSum("abc" , "def"))  // ABCdef
//    var c = curryingFunction("abc", "def")( _ + _.toUpperCase)
//    println(c)  // abcDEF
//
//    val intToInt = curriedSum(1)
//    val res = intToInt(3)
//    println(res)

    // 调用柯里化的方法
    val step1Func = curriedSum2(3)
    val sumCnt = step1Func(4)
    println(sumCnt)


    val num = sum(5, 6)
    println(num) // 11
  }

  // 柯里化的 sum 函数：返回一个函数，但不使用匿名函数，而是用 def 定义局部方法
  def curriedSum2(a: Int): Int => Int = {
    // 定义一个局部方法，它实现了 Int => Int 的逻辑
    def addA(b: Int): Int =  a + b

    // 返回这个局部方法（在 Scala 中，方法名可以通过 _ 转换为函数值）
    addA _
  }

  // 柯里化的 sum 函数
  def curriedSum(a: Int): Int => Int = {
    (b: Int) => a + b
  }

  def sum(a: Int, b: Int): Int = {
    a + b
  }

  // currying 柯里化的方法 ( 一个一个的调用 )
  def curryingFunction(a:String, b:String)(func1:(String, String) => String) = func1(a, b)

  // 两个字符串的拼接
  def getSum(a:String , b:String) = a.toUpperCase() + b

  // 匿名函数的使用
  private def unnamedFunctionTest(): Unit = {
    var l1 = (1 to 10).toList
    var l2 = l1.map((x: Int) => "8" * x)
    // List(8, 88, 888, 8888, 88888, 888888, 8888888, 88888888, 888888888, 8888888888)
    println(l2)
  }

  /**
   * 8
   * 88
   * 888
   * 8888
   * 88888
   * 888888
   * 8888888
   * 88888888
   * 888888888
   * 8888888888
   * List((), (), (), (), (), (), (), (), (), ())
   */
  private def unnamedTest(): Unit = {
    var l1 = (1 to 10).toList

    var func = (x: Int) => println("8" * x)
    var l2 = l1.map(func)
    println(l2)
  }


  // 匿名函数的使用
  // List(8, 88, 888, 8888, 88888, 888888, 8888888, 88888888, 888888888, 8888888888)
  private def unnamedTest2(): Unit = {
    var l1 = (1 to 10).toList

    var func = (x: Int) => "8" * x
    var l2 = l1.map(func)
    println(l2)
  }




}
